import { childrenProps, FormKeys } from '@/components/ProForm/interface';
import { TreeDataProp } from '@/interface/public';
import Decimal from 'decimal.js';

/**
 * @description 将简单数组格式内容转字符串拼接
 */
export const arrSimpleJoinToStr = <T>(arr: Array<T>, flag = ',') => {
  return arr?.length ? arr.join(flag) : '';
};

/**
 * @description 将复杂数组中某个字段转字符串拼接
 */
export function arrJoinToStr<T>(arr: Array<T>, field: FormKeys<T>): string {
  const newArr = arr.map(item => item[field]);
  return newArr.join(',');
}

/**
 *  将复杂数组中某个字段提取出来
 */
export function arrLiftField<T>(arr: Array<T>, field: FormKeys<T>) {
  let newArr = [];
  for (let item of arr) {
    newArr.push(item[field]);
  }
  return newArr;
}

/**
 * @param {Array} originArr 原数组
 * @param {String} label 显示的字段
 * @param {String} value 提交的内容
 * @description 转换为下拉框需要数据
 */
export const arrTransitionSelectData = <T>(originArr: TreeDataProp<T>[], label: FormKeys<T>, value: FormKeys<T> | '' = '') => {
  if (!originArr || !originArr.length) {
    return [];
  }

  return originArr.map(item => {
    return {
      label: item[label],
      value: value ? item[value] : item[label],
      type: 'option',
      children: item.children as childrenProps[]
    };
  }) as childrenProps[];
};

/**
 * @param {String} value 提交的内容
 * @description 数组字段求和
 */
export const arrSummation = (data: Array<any>, field: string) => {
  if (!data?.length) return 0;
  let sum = 0;
  for (let item of data) {
    if (item[field]) {
      sum = new Decimal(sum).add(item[field]).toNumber();
    }
  }
  return sum;
};

/**
 * @description: 根据指定字段进行排序
 * @param {Array} arr
 * @param {string} field
 * @return {*}
 */
export const arrSortItemsByName = (arr: Array<any>, field: string) => {
  arr.sort((a, b) => {
    // 比较两个对象的name属性
    if (a[field] < b[field]) {
      return -1;
    }
    if (a[field] > b[field]) {
      return 1;
    }
    // 如果名称相同，返回0，sort()方法会保持它们的原始顺序
    return 0;
  });
};

/**
 * 对数组中的所有数字添加千分号
 * @param arr 数据
 */
export const arrRoundingFunction = (arr: any[]) => {
  arr.forEach(item => {
    Object.keys(item).forEach(key => {
      if (typeof item[key] === 'number') {
        item['locale_' + key] = item[key].toLocaleString();
      }
    });
  });
};

/**
 * 对数组中的所有数字进行取整千分号
 */
export const arrRoundOff = (arr: any[]) => {
  arr.forEach(item => {
    Object.keys(item).forEach(key => {
      if (typeof item[key] === 'number') {
        item[key] = Math.round(item[key]);
      }
    });
  });
};

/**
 * @description: 更具数组中指定字段进行合并  并对指定字段数量进行求和
 * @param {any} data
 * @param {string} mergeField
 * @param {string} sumField
 */

export const mergeRow = (data: any[], mergeField: string, sumField: string) => {
  if (!data?.length) return [];
  let lodData = JSON.parse(JSON.stringify(data));
  let newArr = [];
  let names = [];

  for (let item of lodData) {
    const index = names.indexOf(item[mergeField]);
    if (index === -1) {
      names.push(item[mergeField]);
      newArr.push(item);
    } else {
      const arr = sumField.split(',');
      for (let key of arr) {
        let a1 = newArr[index][key] || 0;
        let a2 = item[key] || 0;
        newArr[index][key] = new Decimal(a1).add(new Decimal(a2)).toNumber();
      }
    }
  }
  return newArr;
};

// --------------------------树结构相关-------------------------------------

/**
 * 将对应的树结构 装换为有指定字段的树结构
 */
export const arrTransitionTreeData = <T = any>(
  originArr: TreeDataProp<T>[],
  label: FormKeys<T>,
  value: FormKeys<T> | '' = ''
) => {
  if (!originArr || !originArr.length) {
    return [];
  }

  for (let item of originArr) {
    if (item.children) {
      item.children = arrTransitionTreeData<T>(item.children, label, value);
    }
  }
  return arrTransitionSelectData(originArr, label, value);
};

/**
 * 根据树结构中的 value 查询 label
 */
export const arrTreeFindLabel = (treeData: childrenProps[], value: number | string) => {
  for (let item of treeData) {
    if (item.value === value) {
      return item.label;
    }
    if (item?.children) {
      const v = arrTreeFindLabel(item.children, value);
      if (v) return v;
    }
  }
};

/**
 * 获取可以保存树结构的 value
 */
export const arrTreeGetSaveFormValue = (arr: Array<number | string>) => {
  if (!arr || !arr?.length) return '';
  return arr[arr.length - 1] ?? '';
};
